/**
 * @addtogroup bsc_gnss_detect_adapt
 * bsc_gnss_detect_adapt
 * @{
 */
/**
 * @file         bsc_gnss_detect_adapt.h
 * @brief        故障检测和波特率自适应
 * @note    
 * @author       wangyinhui(yinhui.wang@hopechart.com，汪银辉)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-08-15  <td>1.0                   <td>wangyinhui      <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */
#ifndef _BSC_GNSS_DETECT_ADAPT_H_
#define _BSC_GNSS_DETECT_ADAPT_H_

#include "ofc/ofc_types.h"
#include "ofc_object.h"
#include "bsc_gnss/bsc_gnss_server_funcs_interface.h"
#include "bsc_gnss/bsc_gnss_module_interface.h"
#include "bsc_gnss/bsc_gnss_location_frame.h"
#include "hcc_error_code_mid_gnss.h"
#ifdef __cplusplus
extern "C" {
#endif

/**
 * 故障检测和波特率自适应状态机结构体
 */
typedef struct TBsGnssDetectAdaptTag TBsGnssDetectAdapt;
struct TBsGnssDetectAdaptTag
{
PRIVATE
    Int32            detect_cur_state_;                 // 故障检测状态机当前状态
    Int32            adapt_cur_state_;                  // 波特率自适应状态机当前状态
    Int32            module_cur_baudrate_;              // 模块当前波特率
    Int32            server_cur_baudrate_;              // 终端当前波特率
    Int32            target_baudrate_;                  // 目标波特率

    UInt32           loc_err_time_;                     // 判定定位模块异常时长
    UInt32           loc_reset_time_;                   // 判定定位模块重启时长
    UInt32           baudrate_inv_time_;                // 判定波特率无效时长
    UInt32           parse_invalid_tick_;               // 解析无效的tick，本地记录使用
    UInt32           baudrate_invalid_count_;           // 当前模块间波特率无效次数(无法正常通信)
    UInt32           baudrate_invalid_count_max_;       // 当前模块间波特率无效次数上限
    UInt32           set_baudrate_fail_count_;          // 当前设置波特率失败次数
    UInt32           set_baudrate_fail_count_max_;      // 设置波特率失败次数上限
    UInt32           gps_location_invalid_tick_;        // 定位无效时间
    
    UInt8            loc_err_reset_fail_count_;         // 定位无效重启失败次数
    UInt8            loc_err_soft_reset_count_;         // 定位无效模块软重启次数
    UInt8            loc_err_fac_reset_count_;          // 定位无效模块恢复出厂次数
    
    Bool             module_first_set_;                 // 波特率自适应成功后，模块初始化配置标记
    Bool             baud_adapt_endble_;                // 波特率自适应使能标记

    // 接口
    IBsGnssModule      *adapt_module_;                    // 定位模块接口
    IBsGnssServerFuncs *adapt_server_funcs_;              // 定位服务函数接口
    TBsGnssLocationFrame *loc_frame_;
    UInt32           set_server_baudrate_tick_;
};

/**
 * 构造函数
 * @param self: 对象指针
 * @return 
 */
void TBsGnssDetectAdaptCreate(TBsGnssDetectAdapt *self, 
    IBsGnssModule *adapt_module, 
    IBsGnssServerFuncs *adapt_server_funcs, 
    TBsGnssLocationFrame *loc_frame_);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void TBsGnssDetectAdaptDestroy(TBsGnssDetectAdapt *self);

/**
 * 执行函数
 * @param self: 对象指针
 * @return
 */
void TBsGnssDetectAdaptRunOnce(TBsGnssDetectAdapt *self);


// --------------- 属性方法 ---------------

/**
 * 自定义判别定位模块异常时长
 * @param self:  对象指针
 * @param times: 范围在 [10, 120](秒) 之间, 默认值 60 s 
 * @return       参考@ref TBsGnssDetectAdaptErrorCode
 * @note         不建议自定义设置, 最好为 30s
 */
Int32 TBsGnssDetectAdaptSetLocErrTime(TBsGnssDetectAdapt *self, UInt32 time);

/**
 * 自定义判别定位模块重启时长, 既当异常时长超过设定值时, 重启定位模块
 * @param self:  对象指针
 * @param times: 范围在 [200, 600](秒) 之间, 默认值 300 s
 * @note         不建议自定义设置, 最好为 300s
 * @return       参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetLocResetTime(TBsGnssDetectAdapt *self, UInt32 time);

/**
 * 自定义判别波特率无效时长
 * @param self:  对象指针
 * @param times: 范围在 [1, 10](秒) 之间, 默认值 4 s 
 * @return       参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetBaudrateInvTime(TBsGnssDetectAdapt *self, UInt32 time);

/**
 * 自定义波特率无效次数上限
 * @param self:  对象指针
 * @param count: 自定义超时次数, 范围在 [kBsGpsBaudrateCount, 10 * kBsGpsBaudrateCount] 之间, 默认为 2 * kBsGpsBaudrateCount,
 *               建议为 kBsGpsBaudrateCount 的整数倍, kBsGpsBaudrateCount 为支持波特率总数
 * @return       参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetBaudrateInvMaxCount(TBsGnssDetectAdapt *self, UInt32 count);

/**
 * 自定义设置波特率失败次数上限
 * @param self:  对象指针
 * @param count: 自定义失败次数, 范围在 [10, 30] 之间, 默认 15 次
 * @return       参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetSetBaudrateFailMaxCount(TBsGnssDetectAdapt *self, UInt32 count);

/**
 * 设置目标波特率
 * @param self:     对象指针
 * @param baudrate: 设置的目标波特率, 为 9600 或 115200
 * @return          参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetTargetBaudrate(TBsGnssDetectAdapt *self, UInt32 baudrate);

/**
 * 获取终端当前波特率
 * @param self: 对象指针
 * @return      终端当前波特率
 */
Int32 TBsGnssDetectAdaptGetServeBaudrate(TBsGnssDetectAdapt *self);

/**
 * 设置波特率自适应使能
 * @param self:     对象指针
 * @param enable: 使能波特率自适应功能，True 是使能， False是关闭
 * @return          参考@ref TBsGnssDetectAdaptErrorCode
 */
Int32 TBsGnssDetectAdaptSetBaudAdaptEnable(TBsGnssDetectAdapt *self, Bool enable);

/**
 * 获取波特率自适应是否使能
 * @param self:     对象指针
 * @return          True 是使能， False是关闭
 */
Bool TBsGnssDetectAdaptGetBaudAdaptEnable(TBsGnssDetectAdapt *self);


/**
 * 波特率自适应是否已经成功
 * @note 如果没有开波特率自适应使能，则直接返回成功，否则以内部匹配的结果为准
 * @param self:     对象指针
 * @return          True:是,已经成功 False: 否,未成功
 */
Bool TBsGnssDetectAdaptIsSuccess(TBsGnssDetectAdapt *self);
#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
